//
// Created by vell on 2021/11/23.
//
#ifndef V_PLATFORM_H
#define V_PLATFORM_H

#include "VStringUtils.h"
#include<cstdarg>

#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#define VFILE_TAG __FILENAME__

#define VLOG_BUF_SIZE 1024

#define VLOG_ERROR 'E'
#define VLOG_WARN 'W'
#define VLOG_INFO 'I'
#define VLOG_DEBUG 'D'


#define VLOGD(LOG_TAG, ...) { VUtils::log(VLOG_DEBUG, LOG_TAG, __VA_ARGS__);}
#define VLOGI(LOG_TAG, ...) { VUtils::log(VLOG_INFO, LOG_TAG, __VA_ARGS__);}
#define VLOGW(LOG_TAG, ...) { VUtils::log(VLOG_WARN, LOG_TAG, __VA_ARGS__);}
#define VLOGE(LOG_TAG, ...) { VUtils::log(VLOG_ERROR, LOG_TAG, __VA_ARGS__);}

#define VLog(...) VLOGD(VFILE_TAG, __VA_ARGS__)
#define VLogI(...) VLOGI(VFILE_TAG, __VA_ARGS__)
#define VLogE(...) VLOGE(VFILE_TAG, __VA_ARGS__)
#define VLogW(...) VLOGW(VFILE_TAG, __VA_ARGS__)
namespace VUtils {

    inline void log(char pri, const char *tag, const char *fmt, ...) {
        va_list ap;
        char buf[VLOG_BUF_SIZE];

        va_start(ap, fmt);
        vsnprintf(buf, VLOG_BUF_SIZE, fmt, ap);
        va_end(ap);

        struct timespec time{0, 0};
        clock_gettime(CLOCK_REALTIME, &time);
        double nowSec = time.tv_sec + time.tv_nsec / 1000000000.0;
        printf("%lf#%s[%c]: %s\n", nowSec, tag, pri, buf);
    }

}
#endif // V_PLATFORM_H
